package com.guard.net;

import android.os.AsyncTask.Status;
import android.os.Handler;

import com.guard.structures.ProgressObserver;
import com.guard.ui.AbstractActivity;

public abstract class UpdateController implements ProgressObserver {
    protected AbstractActivity mActivity;

    protected UpdateTask mUpdateTask = null;

    private boolean isAutoUpdate = true;

    private int mUpdateInterval;

    private Handler mHandler = new Handler();

    private Runnable mUpdateThread = new Runnable() {
        public void run() {
            update();
        }
    };

    public UpdateController(AbstractActivity activity) {
        mActivity = activity;
    }

    @Override
    public void onStarted(Object obj) {

    }

    @Override
    public void onProgress(Object obj) {

    }

    @Override
    public void onFinished(Object obj) {
        if (isAutoUpdate) {
            startUpdateThread(mUpdateInterval);
        }
    }

    public void startUpdateThread(int delay) {
        mHandler.postDelayed(mUpdateThread, delay);
    }

    private void update() {
        mUpdateTask = getUpdateTask();
        mUpdateTask.registerObserver(this);
        try {
            mUpdateTask.execute((Void) null);
        } catch (Exception e) {

        }
    }

    public abstract UpdateTask getUpdateTask();

    private void clearRunningTasks() {
        mHandler.removeCallbacks(mUpdateThread);
        if (mUpdateTask != null) {
            if (mUpdateTask.getStatus() != Status.FINISHED) {
                mUpdateTask.unRegisterObserver(this);
                mUpdateTask.cancel(true);
            }
            mUpdateTask = null;
        }
    }

    public void cancelUpdateTask() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                clearRunningTasks();
            }
        }).start();

    }

    public void setAutorefreshEnabled(boolean isEnabled) {
        isAutoUpdate = isEnabled;
    }

    public boolean isAutorefreshEnabled() {
        return isAutoUpdate;
    }

    public int getUpdateInterval() {
        return mUpdateInterval;
    }

    public void setUpdateInterval(int mUpdateInterval) {
        this.mUpdateInterval = mUpdateInterval;
    }

}
